//import java.util.HashSet;
//import java.util.Set;
//
//class Solution443 {
//
//    public int minMutation(String startGene, String endGene, String[] bank) {
//        // 记录 基因库里
//           Set<String> hash = new HashSet<>() ;
//           // 记录 已经遍历过的
//        Set<String> used = new HashSet<>() ;
//        // 用来方便修改字符
//        char[] vis = {'A' , 'C' , 'G' , 'T'} ;
//        for(String str : bank){
//            hash.add(str) ;
//        }
//      // 1. 如果 开始字符串和 最终字符串相同 直接返回
//      if(startGene.equals(endGene))return 0 ;
//      // 2. 如果 最终字符串 不在基因库里 , 那么无论怎么变也不会变成最终字符串
//      if(!hash.contains(endGene))return -1 ;
//      // 3. 开始bfs
//      Queue<String> queue = new LinkedList<>() ;
//      // 入队
//     queue.add(startGene) ;
//     // 标记一下开始字符串,这个字符串已经被遍历过了
//      used.add(startGene);
//
//      // 4. 记录最小路径长度
//      int len = 0 ;
//
//       // bfs
//       while(!queue.isEmpty()){
//           int size = queue.size() ;
//            len ++ ;
//           for(int i=0 ; i < size ; i ++){
//             String tmp = queue.poll() ;
//              // 一个一个字符去 遍历 , 修改 成 vis 里的 ,
//             for(int j=0 ; j < 8 ; j ++){
//                // 换成数组方便改变字符
//                 char[] arr =tmp.toCharArray() ;
//               for(int z = 0 ; z < 4 ; z++){
//                  arr[j] = vis[z] ;
//                  String ret = new String(arr) ;
//                  // 如果 字符串 在基因库里 , 同时没有被遍历过, 就入队列
//                  if(hash.contains(ret) && !used.contains(ret)){
//                    queue.add(ret) ;
//                    used.add(ret) ; // 标记字符串, 已经被遍历过
//                  }
//                  // 如果字符串 和最终字符串相同, 那么返回 最短路径
//                  if(ret.equals(endGene)){
//                    return len ;
//                  }
//               }
//             }
//           }
//       }
//     // 没有 可以变化的路径
//       return -1 ;
//
//    }
//
//
//}